/*
* chImage
* 用于图像处理
*/

#ifndef CHIMAGE_H
#define CHIMAGE_H

//用到的dlc
#include <math.h>
#include <QFile>
#include <QByteArray>
#include <QString>
#include "QDebug"
#include <windef.h>
#include <wingdi.h>
#include <QDebug>
#include <string.h>
#include <cstdlib>
#include <ctime>
#include <qdatastream.h>

#define random(x) rand()%(x)

//定义位操作
//获取index位
#define GET_BYTE(vbyte, index) (((vbyte) & (1 << ((index) ^ 7))) != 0)
//将index位设置为1
#define SET_BYTE(vbyte, index) ((vbyte) |= (1 << ((index) ^ 7)))
//将index位设置为0
#define CLR_BYTE(vbyte, index) ((vbyte) &= (~(1 << ((index) ^ 7))))

//有两种方案，第一种，作为比特流处理，用位操作修改比特流的固定位，实现。
//第二种方案，建立位数组，修改数组数据的最后一位。


//数据结构
typedef struct IMAGEPIXEL{

}IMAGEPIXEL;


class ChImage
{
public:
    ChImage(QString);              //初始化读入图片
    ChImage(std::string);               //另一种备用的构造器,使用c++原生的FILE
    bool checkImage();      //检查输入的内容是否是位图
    int getImageHeight();   //获取图片高度
    int getImageWidth();    //获取图片宽度
    int getFileSize();      //获取包括文件头在内的图片大小（以byte为单位）
    int getImageSize();     //获取不包括文件头在内的图片大小（以byte为单位）
    int getSizeByAttributes();//通过图像长宽等属性获取图片大小（以byte为单位）
    int getBitCount();      //获取图片类型（256灰度图或者24位真彩图）
    int getOffBits();       //获取位图数据起始位置

    void insert(char* msg);         //图片信息插入
    void extract();        //图片信息取出
    bool read();           //读取图片信息为比特流
    bool save(QString);           //图片保存
    char* getExtract(){
        return hasExtract;
    }
    void addNoise();       //为图片随机增加噪声
    void toAdd(int type);

private:
    //打开图片用QFile扩展类
    QFile *chFile;
    //FILE类打开图片用
    FILE *cFile;
    //图片文件头，内含图片基本信息
    BITMAPFILEHEADER *fileHeader;
    BITMAPINFOHEADER *infoHeader;


    //图片大小
    //int size;
    //图片的宽
    //int width;
    //图片的高
    //int height;
    //图片字节数组指针
    BYTE *chBytes;
    char* hasExtract;
};

#endif // CHIMAGE_H
